package net.tngou.iask.action.api;



import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

import net.tngou.iask.action.BaseAction;
import net.tngou.iask.enums.LevelEnum;
import net.tngou.iask.jdbc.PageUtil;
import net.tngou.iask.pojo.Main;
import net.tngou.iask.pojo.POJO;
import net.tngou.iask.pojo.Type;
import net.tngou.iask.pojo.User;
import net.tngou.iask.service.UserService;
import net.tngou.iask.util.DigestMD;
import net.tngou.iask.util.ImgTool;
import net.tngou.iask.util.OAuthUtil;
import net.tngou.iask.util.StringUtil;

/**
 * 成员接口 主要是实体管理员和实体用户
 * 成员列表
 * 成员添加
 * 重置账号/密码
 * 修改成员信息
 * 修改个人信息
 * 修改个人密码
 * 
 * @author tngou@tngou.net
 *
 */
public class UserApi extends BaseAction {
	private final static Logger log= LoggerFactory.getLogger(UserApi.class);
	
	
	/**
	 * 用户列表
	 */
	public void list() {
//		if(user==null){
//			run_nologin();return;
//		}
//		if((user.getRole()!=3&&user.getRole()!=4)||user.getMain()<=0){
//			run_false("没有添加用户权限");return;
//		}
//		UserService service = new UserService();
//		PageUtil page = service.getPage(ask.getPage(), ask.getSize(), user.getMain(), ask.getRole(), ask.getKeyword());
//		printJson(toJsonPage(page));
	}
	/**
	 * 添加用户（管理者）
	 */
	public void add() {
		if(user==null){
			run_nologin();return;
		}
		if(user.getMain()!=0)
		{
			Main main = new Main().get(user.getMain());
			
			if((user.getRole()!=3&&user.getRole()!=4)||main==null||main.getType()==-1||main.getType()==-2){
				run_false("没有添加用户权限");return;
			}
			if(main.getType()==1||main.getType()==2||main.getType()==3||main.getType()==4)
			{
				Type type = new Type().get(main.getType());
				if(type==null) {run_false("没有添加用户权限");return;}
				int total = new User().totalCount("main="+main.getId());
				if(total>=type.getUcount()) //判断用户是否超过添加限制
				{
					run_false("添加的成员已打上线，不能再添加！");return;
				}
						
			}
		}else if(user.getRole()!=1&&user.getRole()!=2)
		{
			run_false("没有添加用户权限");return;
		}
		
		User bean = getAsk(User.class);
		if(isEmpty(bean.getAccount(),bean.getPassword(),bean.getName()))//账号、密码、姓名
		{
			run_false("请求的参数不正确！");return;	
		}
		if(bean.getRole()<3&&(user.getRole()!=1&&user.getRole()!=2)){
			run_false("请正确的选择用户权限！");return;
		}
		@SuppressWarnings("serial")
		POJO u = bean.get(new HashMap<String,Object>(){{
			put("account", bean.getAccount());
			put("main",user.getMain());
		}});
		if(u!=null){
			run_false("该账号已经存在！");return;	
		}
		bean.setMain(user.getMain());
		bean.setPassword(DigestMD.MD5(bean.getPassword()));
		String access_token = OAuthUtil.Access_token(user.getAccount(),bean.getPassword(),user.getMain());
		String refresh_token = OAuthUtil.Refresh_token(user.getAccount());
		bean.setAccess_token(access_token);
		bean.setRefresh_token(refresh_token);
		long b = bean.save();

		if(b>0){
			saveLog(LevelEnum.operation, "添加账号("+bean.getId()+":"+bean.getName()+")");
			run_success(b+"");//返回用户ID
			}
		else {run_false("添加失败！");return;}
		
	}
	
	/**
	 * 重置密码/账号（管理者）
	 */
	public void init() {
		if(user==null)
		{
			run_nologin();return;
		}
		if(user.getRole()!=3&&user.getRole()!=4){
			run_false("没有修改用户权限");return;
		}
		User bean = getAsk(User.class);
		if(bean.getId()<=0||isEmpty(bean.getPassword(),bean.getAccount()))
		{
			run_false("请求的参数不正确！");return;
		}
		User u = bean.get(bean.getId());
		if(u==null||user.getMain()!=u.getMain())
		{
			run_false("没有修改用户权限！");return;
		}
		if(!u.getAccount().equals(bean.getAccount()))//更新账号
		{
			@SuppressWarnings("serial")
			POJO p = bean.get(new HashMap<String,Object>(){{
				put("account", bean.getAccount());
				put("main",user.getMain());
			}});
			if(p!=null){
				run_false("该账号已经存在！");return;	
			}
			u.setAccount(bean.getAccount());
		}
		
		if(bean.getInit()==0)u.setInit(0);
		else u.setInit(1);
		u.setPassword(DigestMD.MD5(bean.getPassword()));	
		UserService service = new UserService();
		String access_token = OAuthUtil.Access_token(u.getAccount(),u.getPassword(),u.getMain());
		String refresh_token = OAuthUtil.Refresh_token(u.getAccount());
		session.deleteUser(u.getAccess_token());//删除Session的缓存
		u.setAccess_token(access_token);
		u.setRefresh_token(refresh_token);
		long b = u.update();	
		service.saveLogin(access_token, refresh_token, u);//更新Login记录
		if(b>0){
			saveLog(LevelEnum.operation, "初始化账号密码("+u.getId()+":"+u.getName()+")");
			run_success("更新成功");
			}
		else run_false("添加失败！");return;
		
	}
	
	
	/**
	 * 修改用户（管理者）
	 */
	public void change() {
		if(user==null)
		{
			run_nologin();return;
		}
		if(user.getMain()!=0)
		{
			if(user.getRole()!=3&&user.getRole()!=4){
				run_false("没有修改用户权限");return;
			}
		}else if(user.getRole()!=1&&user.getRole()!=2)
		{
			run_false("没有添加用户权限");return;
		}
		User bean = getAsk(User.class);
		if(bean.getId()<=0)
		{
			run_false("没有修改用户资料不全");return;
		}
		User u = bean.get(bean.getId());
		if(u==null||user.getMain()!=u.getMain())
		{
			run_false("没有修改用户权限！");return;
		}
		Map<String, Object> map = new HashMap<>();
		if(StringUtil.isNotEmpty(bean.getName()))map.put("name", bean.getName());//名称
		if(StringUtil.isNotEmpty(bean.getPhone()))map.put("phone", bean.getPhone());//电话
		if(StringUtil.isNotEmpty(bean.getEmail()))map.put("email", bean.getEmail());//邮箱
		if(StringUtil.isNotEmpty(bean.getPosition()))map.put("position", bean.getPosition());//职位
		if(bean.getRole()!=u.getRole())map.put("role", bean.getRole());//角色
		long b = bean.update(map,bean.getId());
		if(b>0){
			saveLog(LevelEnum.operation, "修改账号信息("+u.getId()+":"+u.getName()+")");
			run_success("修改成功");}
		else run_false("修改失败");
	}
	
	/**
	 * 更新用户信息（自己）
	 */
	public void update() {
		if(user==null)
		{
			run_nologin();return;
		}
		User bean = getAsk(User.class);
		if(StringUtil.isNotEmpty(bean.getName()))user.setName(bean.getName());//名称
		if(StringUtil.isNotEmpty(bean.getPhone()))user.setPhone(bean.getPhone());//电话
		if(StringUtil.isNotEmpty(bean.getEmail()))user.setEmail(bean.getEmail());//邮箱
		if(StringUtil.isNotEmpty(bean.getPosition()))user.setPosition(bean.getPosition());//职位	
		long b = user.update();
		if(b>0)
		{
			 session.setUser(user);
			 run_success("更新成功！");
			 saveLog(LevelEnum.operation, "修改个人信息！");
		}else
		{
			run_false("更新失败！");
		}
		
		
		
	}
	
	
	/**
	 * 重置密码（自己）
	 */
	public void resetpwd() {
		if(user==null)
		{
			run_nologin();return;
		}
		String pwd=request.getParameter("pwd");//原始密码
		String password=request.getParameter("password");//新密码
		
		if(isEmpty(pwd,password))
		{
			run_false("请求的参数不正确！");return;
		}
		
		pwd=DigestMD.MD5(pwd);
		password=DigestMD.MD5(password);	
		if(!user.getPassword().equals(pwd))
		{
			run_false("原始密码错误！");return;
		}
		if(pwd.equals(password))
		{
			run_false("新密码不能与原始密码一样！");return;
		}
		UserService service = new UserService();
		String access_token = OAuthUtil.Access_token(user.getAccount(),password,user.getMain());
		String refresh_token = OAuthUtil.Refresh_token(user.getAccount());

		user.setInit(0);
		response.addAutoLoginCookie(access_token);//  修改密码做 临时 Cookie
		service.saveLogin(access_token, refresh_token, user);
		session.deleteUser(tngou_id);//Session 删除缓存
		user.setAccess_token(access_token);
		user.setRefresh_token(refresh_token);
		user.setPassword(password);
		session.setUser(user);
		JSONObject object = new JSONObject();
		object.put("access_token", access_token);
		object.put("msg", "密码修改成功！");
		saveLog(LevelEnum.operation, "帐户 重置密码");	
		printJson(toJsonP(object));
	}
	
	/**
	 * 保存头像
	 */
	public void saveavatar() {
		if(user==null){
			run_nologin();return;
		}
		String rootPath= request.getServletContext().getRealPath("");	
		String imgurl= request.getParameter("imgurl");//图片URL		
		String imgbase64=request.getParameter("imgbase64");//图片Base64编码	
		if(isEmpty(imgurl,imgbase64))
		{
			run_false("请求的参数不正确！");return;
		}
		String data = StringUtil.removeStart(imgbase64, "data:image/png;base64,");
		imgurl=StringUtil.remove(imgurl, getDomain());
		StringUtil.replace(imgurl, "/", File.separator);
		File file = new File(rootPath+File.separator+imgurl);
		if(file.isFile())file.delete();//删除文件
		ImgTool imgTool = new ImgTool();
		BufferedImage img = imgTool.base64ToImage(data);
		if(img!=null)
		{
			img=imgTool.resize(img, 200, 200);
			File imgfile = imgTool.save(img, rootPath+File.separator+"common"+File.separator+"avatar"+File.separator+user.getId()+".png");
			if(imgfile!=null&&imgfile.isFile())
			{
				user.setAvatar("/common/avatar/"+user.getId()+".png");
				user.update();
				session.setUser(user);
				run_success("更新成功");
				return;
			}
		}
		run_false("更新失败");
		
				
		
	}
	
	
}
